﻿#define _CRT_SECURE_NO_WARNINGS 1

/*转移表*/
//用函数指针数组实现回调函数
//#include<stdio.h>
//int add(int a, int b)//加
//{
//	return a + b;
//}
//int sub(int a, int b)//减
//{
//	return a - b;
//}
//int mul(int a, int b)//乘
//{
//	return a * b;
//}
//int div(int a, int b)//除
//{
//	return a / b;
//}
//int main()
//{
//	int x, y;//操作数
//	int input = 1;//菜单选择
//	int ret = 0;//结果
//	//函数指针数组
//	int(* p[5])(int x, int y) = { 0,add,sub,mul,div };
//	do
//	{
//		printf("*************************\n");
//		printf(" 1:add 2:sub \n");
//		printf(" 3:mul 4:div \n");
//		printf(" 0:exit \n");
//		printf("*************************\n");
//		printf("请选择：");
//		scanf("%d", &input);
//		if ((input <= 4 && input >= 1))
//		{
//			printf("输入操作数：");
//			scanf("%d %d", &x, &y);
//			ret = (*p[input])(x, y);
//			printf("ret = %d\n", ret);
//		}
//		else if (input == 0)
//		{
//			printf("退出计算器\n");
//		}
//		else
//		{
//			printf("输入有\n误");
//		}
//
//	} while (input);
//	return 0;
//}

/*qsort函数：*/
/*
  void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *));
  base是指向数组首元素的指针。

  nitems是数组中元素的数量。

  size是数组中每个元素的大小，以字节为单位。

  compar是一个比较函数，用于确定排序的顺序。
  比较函数compar的原型应该是这样的：
  int cmp(const void *a, const void *b);
  如果a应该在b之前，则返回负数；如果a和b相等，则返回零；如果a应该在b之后，则返回正数。
*/

/*练习使用qsort函数*/
//#include<stdio.h>
//#include<stdlib.h>//qsort
//#include<string.h>
////用qsort排序整型数据
//int cmp_int(const void* a, const void* b)
//{
//	return *(int*)a - *(int*)b;
//}
////用qsort排序字符型数据
//int cmp_char(const void* a, const void* b)
//{
//	return strcmp((char*)a, (char*)b);
//}
//struct student
//{
//	char name[20];
//	int age;
//};
////用qsort排序结构体数据
////按年龄
//int cmp_stu_by_age(const void* a, const void* b)
//{
//	return ((struct student*)a)->age - ((struct student*)b)->age;
//}
////按名字
//int  cmp_stu_by_name(const void* a, const void* b)
//{
//	return ((struct student*)a)->name - ((struct student*)b)->name;
//}
//int main()
//{
//	int a[10] = { 9,8,7,6,5,4,3,2,1 };
//	int sz = sizeof(a) / sizeof(a[0]);
//	qsort(a, sz, sizeof(a[0]), cmp_int);
	//for (int i = 0; i < sz; i++)
	//{
	//	printf("%d ", a[i]);
	//}
//	printf("\n******************************\n");
//	char str[5] = {'a','d','c','b','e'};
//	int sz_char = sizeof(str) / sizeof(str[1]);
//	qsort(str, sz_char, sizeof(str[0]), cmp_char);
//	for (int i = 0; i < sz_char; i++)
//	{
//		printf("%c ", str[i]);
//	}
//	printf("\n******************************\n");
//	struct student s[] = { {"zhangsan",19},{"lisi",17} };
//	qsort(s, sizeof(s) / sizeof(s[0]), sizeof(s[0]), cmp_stu_by_age);
//	qsort(s, sizeof(s) / sizeof(s[0]), sizeof(s[0]), cmp_stu_by_name);
//	return 0;
//}

//找单身狗2
/*
一个数组中只有两个数字是出现一次，其他所有数字都出现了两次。
编写一个函数找出这两个只出现一次的数字。
例如：
有数组的元素是：1，2，3，4，5，1，2，3，4，6
只有5和6只出现1次，要找出5和6.
*/
/* 个人思路 */
//#include<stdio.h>
//#include<stdlib.h>
//int cmp_int(const void* a, const void* b)
//{
//	return *(int*)a - *(int*)b;
//}
//void Find_dog(int arr[],int sz)
//{
//	qsort(arr, sz, sizeof(arr[0]), cmp_int);
//	for (int i = 0; i < sz; i++)
//	{
//		if (i>0 && i<(sz-1))
//		{
//			if (arr[i]!=arr[i-1] && arr[i]!=arr[i+1])
//			{
//				printf("找到单身狗:%d\n", arr[i]);
//			}
//		}
//		else if (i==0)
//		{
//			if (arr[i] != arr[i + 1])
//			{
//				printf("找到单身狗:%d\n", arr[i]);
//			}
//		}
//		else
//		{
//			if (arr[i]!=arr[i-1])
//			{
//				printf("找到单身狗:%d\n", arr[i]);
//			}
//		}
//	}
//	
//}
//int main()
//{
//	int arr[] = { 1,2,3,4,5,1,2,3,4,6 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	Find_dog(arr, sz);
//	
//	return 0;
//}
/* 老师思路 */
/* 0101 -- 5
  ^0110 -- 6
  =0011 -- 倒数第一位和第二位都能做pos位
*/
//#include<stdio.h>
//void Find_num(int a[],int sz,int *pnum1,int *pnum2)
//{
//	//1、所有数字异或一遍，得到不同的两个数的异或结果
//	int ret = 0;
//	for (int i = 0; i < sz; i++)
//	{
//		ret ^= a[i];
//	}
//	//2、从异或结果中找出为1的那一位，pos位
//	int pos = 0;
//	for (int i = 0; i < 32; i++)
//	{
//		if ((ret >> i) & 1==1) 
//		{
//			pos = i;
//			break;
//		}
//	}
//	//3、pos位为0的为一组，pos位为1的一组，每组分别异或
//	for (int i = 0; i < sz; i++)
//	{
//		if (((a[i] >> pos )& 1)==1)
//		{
//			*pnum1 ^= a[i];
//		}
//		else
//		{
//			*pnum2 ^= a[i];
//		}
//	}
//}
//int main()
//{
//	int arr[] = { 1,2,3,4,5,1,2,3,4,6 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int num1 = 0;
//	int num2 = 0;
//	Find_num(arr, sz, &num1, &num2);
//	printf("%d,%d", num1, num2);
//	return 0;
//}

/*输入年份和月份输出该月有多少天*/
//#include <stdio.h>
//void Day(int year, int month)
//{
//    int day = 0;
//    int D[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
//    //判断闰年
//    if (((year % 4) == 0 && (year % 100) != 0) || (year % 400) == 0)
//    {
//        if (month == 2)
//        {
//            day = 29;
//        }
//        else {
//            day = D[month];
//        }
//    }
//    else {
//        day = D[month];
//    }
//    printf("%d\n", day);
//}
//int main() {
//    int a, b;
//    while (scanf("%d %d", &a, &b) != EOF) { // 注意 while 处理多个 case
//
//        Day(a, b);
//    }
//    return 0;
//}